var express = require('express');
const userModel = require('../models/userModel');
var router = express.Router();
var bcrypt=require('bcryptjs');
var salt=bcrypt.genSaltSync(10);//加盐,盐值越大密码强度越高,越容易崩服务器
var jwt=require('jsonwebtoken');
const { checkToken } = require('../utils/tools');
var secret='cara'
//账号和用户相关的开发
router.post('/',async(req,res)=>{
  let{username,password,roleId}=req.body;
  let result=userModel.find({username});
  if(result.length){
    res.send({
      code:0,
      msg:'用户名已存在'
    })
    return;
  }
  //加密
  var hash=bcrypt.hashSync(password,salt);
  //录入数据库
  await new userModel({
    username,
    "password":hash,roleId
  }).save();
  res.send({
    code:1,
    msg:'注册成功'
  })
})
//登录
router.get('/', async function(req, res, next) {
  let {username,password}=req.query;
  let result=await userModel.find({username});
  //判断用户是否存在
  if(!result.length){
    res.send({
      code:0,
      msg:'用户不存在,请先注册'
    })
    return;
  }
   
  //判断密码是否正确
  let hash=result[0].password;//加密密码
  let bool=bcrypt.compareSync(password,hash);
  if(!bool){
    res.send({
      code:0,
      msg:'登录失败,密码错误'
    })
    return;
  }
  //签发token令牌(签发时间+有效时长)
  let token=jwt.sign({
    time:Date.now(),//获取时间戳
    expire:1000*60*60*24*1//过期时间
    //秒*分*时*天
  },secret);
  let data=result[0];
  data.password=''//不暴敏感信息
  res.send({
    code:1,
    msg:'登录成功',
    data,
    token
  })
});
//token验证
router.get('/auth',async(req,res)=>{
  console.log(req.headers);//提取本次请求中携带的信息
  let {token}=req.headers;
  //合法性判断
  try {
    let decoded=jwt.verify(token,secret)//解析token携带信息
    let {time,expire}=decoded;
    //有效性判断
    let now=Date.now();//当前时间
    if(now-time>expire){
      res.send({
        code:402,
        msg:'token已过期,请重新登录'
      })
      return; 
    }
  } catch (error) {
    res.send({
      code:401,
      msg:'token不合法,请重新登录'
    })
    return;
  }
  //验证成功
  res.send({
    code:1,
    msg:'token验证成功'
  })
})

//用户信息更新（头像上传）
router.put('/',(req,res,next)=>{checkToken(req,res,next)},async(req,res)=>{
  // 用户id、更新的数据包
  let {id} = req.query
  try {
    let result = await userModel.updateOne({_id:id},req.body)
    res.send({code:1,msg:'用户信息更新成功'})
  } catch (error) {
    res.send({code:1,msg:'更新失败'})
  }
})

module.exports = router;
